class Solution {
public:
	//使用哈希结构来存储 期望的字符频数 和 当前的需统计字符频数
	unordered_map<char,int> ori,cnt;
	//检查频数是否达到要求
	bool check()
	{
		for(auto c : ori)
		{
			if(cnt[c.first] < c.second) return false;
		}
		return true;
	}
	string minWindow(string s, string t) {
		//计算目标字符频数
		for(auto i : t)
		{
			ori[i]++;
		}
		int l = 0, r = -1, ansL = -1;
		int size = s.size();
		int len = INT_MAX;
		while(r < size-1)
		{
			//右指针移动，若遇到待统计字符，则频数+1
			//细节：先++再判断，这样能够方便后续计算和理解
			if(ori.find(s[++r]) != ori.end()) cnt[s[r]]++;
			//判断当前窗口能否满足要求
			while(check() && l <= r)
			{
				//若满足
				//先重计算窗口最小长度以及对应的左指针
				if(r - l + 1 < len)
				{
					len = r - l + 1;
					ansL = l;
				}
				//对当前窗口进行优化
				//若左指针指向位置是目标字符，则对应频数--
				if(ori.find(s[l]) != ori.end()) cnt[s[l]]--;
				l++;
			}
		}
		return ansL == -1 ? "" : s.substr(ansL,len);
	}
};
